﻿using System;
using System.Collections.Generic;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using NGI_Entidades;
using NGI_Logica;
using NGI_Auxiliares;
using NGI_Enumerador;

namespace NGI_Sistema.Forms
{
    public partial class ABMProductos : Form
    {
        #region Propiedades
        private Producto _productoSeleccionado;
        
        private ResultadosOperaciones _resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
        private CartelResultadoOperacion car;
        private TiposOperaciones _operacion = TiposOperaciones.Alta;
        private ArrayList _validaciones = new ArrayList();

        public delegate void functioncall(Int32 Id);
        private event functioncall seleccionFunctionPointer;
        private event functioncall eliminacionFunctionPointer;

        private GrillaBusquedaEliminacion gre = new GrillaBusquedaEliminacion(TiposDatos.Producto);
        #endregion Propiedades

        #region Constructores
        public ABMProductos()
        {
            InitializeComponent();
            this.AgregarValidaciones();
        }
        #endregion Constructores

        #region Receptor de grilla de búsqueda
        private void EliminarEntidad(Int32 Id)
        {
            try{
                this._operacion = TiposOperaciones.Baja;
                Producto unProducto = Producto.SinDatos(Id);
                Productos.EliminarPreciosPersonalizados(unProducto);
                Productos.Eliminar(unProducto);

                ArrayList ListadoProductos = Productos.CargarTodos(true);
                gre.CargarDatos(ListadoProductos);
                this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;
                this.LimpiarInputs();
            }
            catch (Exception Ex)
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
            }
            this.car.ElResultadoFue(this._resultadoUltimaOperacion);
        }

        private void EntidadSeleccionada(Int32 Id)
        {
            this._operacion = TiposOperaciones.Modificacion;
            this._productoSeleccionado = Productos.TraerDatosDe(Id);
            this.LlenarCampos();

            this.lblOperacion.Text = "Modificando producto: " + this._productoSeleccionado.Nombre + ".";
        }
        #endregion Receptor de grilla de búsqueda

        #region Funciones privadas
        private void AgregarValidaciones()
        {
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtNombre, this.lblNombre, TiposValidaciones.Requerido));
            this._validaciones.Add(Validacion.NuevaValidacion(this.txtPrecioUnitario, this.lblPrecioUnitario, TiposValidaciones.Requerido, ","));
        }

        private void CrearCartelDeResultados()
        {
            this.car = new CartelResultadoOperacion(pnlCartelResultadoOperacion.Height, pnlCartelResultadoOperacion.Width, (this.pnlCartelResultadoOperacion.Location.Y - pnlCartelResultadoOperacion.Height));
            pnlCartelResultadoOperacion.Controls.Add(car);
        }

        private void LlenarCampos()
        {
            this.txtId.Text = this._productoSeleccionado.ID.ToString();
            this.txtNombre.Text = this._productoSeleccionado.Nombre;

            decimal PrecioUnitario = new decimal(this._productoSeleccionado.PrecioUnitario);
            this.txtPrecioUnitario.Text = Funciones.RellenarDecimalConCeros(PrecioUnitario, "###,##");
            this.txtDescripcion.Text = this._productoSeleccionado.Descripcion;
            this.chkActivo.CheckState = this._productoSeleccionado.Activo == true ? CheckState.Checked : CheckState.Unchecked;

            this.dgvPreciosPersonalizados.Rows.Clear();
            if (this._productoSeleccionado.PreciosPersonalizados != null && this._productoSeleccionado.PreciosPersonalizados.Length > 0)
            {
                foreach (PrecioPersonalizado Precio in this._productoSeleccionado.PreciosPersonalizados)
                {
                    this.dgvPreciosPersonalizados.Rows.Add(Precio.Cantidad.ToString(), Precio.PrecioUnitario.ToString(), Precio.Activo ? CheckState.Checked : CheckState.Unchecked);
                }
            }
        }

        private void LimpiarInputs()
        {
            this.txtId.Text = "";
            this.txtNombre.Text = "";
            this.txtDescripcion.Text = "";
            this.txtPrecioUnitario.Text = "";
            this.lblPrecioUnitario.ForeColor = Color.Black;
            this.lblNombre.ForeColor = Color.Black;
            this.dgvPreciosPersonalizados.Rows.Clear();
        }

        private PrecioPersonalizado[] GenerarPreciosPersonalizados()
        {
            PrecioPersonalizado[] PreciosPersonalizados = new PrecioPersonalizado[this.dgvPreciosPersonalizados.Rows.Count - 1];

            Int32 a = 0;
            foreach (DataGridViewRow row in this.dgvPreciosPersonalizados.Rows)
            {
                if (Convert.ToInt32(row.Cells[0].Value) > 0 && Convert.ToDouble(row.Cells[1].Value) > 0)
                {
                    PreciosPersonalizados[a] = PrecioPersonalizado.NuevoPrecioPersonalizado(Convert.ToInt32(row.Cells[0].Value), Convert.ToDouble(row.Cells[1].Value), Convert.ToBoolean(row.Cells[2].Value));
                    a++;
                }
            }

            return PreciosPersonalizados;
        }

        private void CartelesNegros()
        {
            this.lblDescripcion.ForeColor = Color.Black;
            this.lblNombre.ForeColor = Color.Black;
            this.lblPrecioUnitario.ForeColor = Color.Black;
        }
        #endregion Funciones privadas

        #region Eventos
        private void ABMProductos_Load(object sender, EventArgs e)
        {
            this.CrearCartelDeResultados();

            seleccionFunctionPointer += new functioncall(EntidadSeleccionada);
            eliminacionFunctionPointer += new functioncall(EliminarEntidad);
            gre.seleccionFunctionPointer = seleccionFunctionPointer;
            gre.eliminacionFunctionPointer = eliminacionFunctionPointer;

            this.lblOperacion.Text = "Creando producto.";

            ArrayList ListadoProductos = Productos.CargarTodos(true);
            gre.CargarDatos(ListadoProductos);
            this.pnlPersonalizado.Controls.Add(gre);
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            this.CartelesNegros();
            if (FuncionesFormulario.TodosLosCamposValidos(this._validaciones))
            {
                Producto unProducto = new Producto();

                PrecioPersonalizado[] PreciosPersonalizados = this.GenerarPreciosPersonalizados();
                Boolean CheckboxState = this.chkActivo.CheckState == CheckState.Checked ? true : false;
                decimal PrecioUnitario = System.Math.Round(new decimal(Convert.ToDouble(this.txtPrecioUnitario.Text.Replace(' ', '0'))), 2);

                try
                {
                    switch (this._operacion)
                    {
                        case TiposOperaciones.Alta:
                            unProducto = Producto.ProductoNuevo(this.txtNombre.Text, this.txtDescripcion.Text, Convert.ToDouble(PrecioUnitario), CheckboxState, PreciosPersonalizados);
                            int id = Productos.Crear(unProducto, Program.SesionActiva.UsuarioLogueado.ID);
                            unProducto.ID = id;
                            break;
                        case TiposOperaciones.Modificacion:
                            unProducto = Producto.ProductoExistente(Convert.ToInt32(this.txtId.Text), this.txtNombre.Text, this.txtDescripcion.Text, Convert.ToDouble(PrecioUnitario), CheckboxState, PreciosPersonalizados);
                            Productos.Modificar(unProducto, Program.SesionActiva.UsuarioLogueado.ID);
                            break;
                    }

                    Productos.EliminarPreciosPersonalizados(unProducto);
                    Productos.InsertarPreciosPersonalizados(unProducto, Program.SesionActiva.UsuarioLogueado.ID);
                    this._resultadoUltimaOperacion = ResultadosOperaciones.Exitoso;

                    ArrayList ListadoProductos = Productos.CargarTodos(true);
                    gre.CargarDatos(ListadoProductos);

                    this.LimpiarInputs();
                    this.gre.DeseleccionarOpcion();
                }
                catch (Exception Ex)
                {
                    this._resultadoUltimaOperacion = ResultadosOperaciones.NoExitoso;
                }

                this.car.ElResultadoFue(this._resultadoUltimaOperacion);
            }
            else
            {
                this._resultadoUltimaOperacion = ResultadosOperaciones.CamposMinimosNoCompletados;
                this.car.ElResultadoFue(this._resultadoUltimaOperacion);
            }
        }

        private void btnLimpiar_Click(object sender, EventArgs e)
        {
            this.lblOperacion.Text = "Creando producto.";
            this._operacion = TiposOperaciones.Alta;
            this.CartelesNegros();
            this.LimpiarInputs();
            this.gre.DeseleccionarOpcion();
        }
        #endregion Eventos
        
    }
}
